﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using kk.components.contracts;
using kk.messages.contracts.DataModel;

namespace kk.saalbestuhlungsadapter
{
    public class SaalbestuhlungsAdapter : ISaalbestuhlungsAdapter
    {
        private readonly string defaultSaalFilename;


        public SaalbestuhlungsAdapter() : this("saal.txt"){}
        internal SaalbestuhlungsAdapter(string defaultSaalFilename)
        {
            this.defaultSaalFilename = defaultSaalFilename;
        }


        public void ProcessBestuhlungZuSaal(Request<string, Saalplan> requestBySaalname)
        {
            requestBySaalname.ResponsePin(new Saalplan(ParseFile(this.defaultSaalFilename)));
        }


        internal static IEnumerable<Platz> ParseFile(string filename)
        {
            return ParseRows(File.ReadAllLines(filename).Where(line => line.Trim() != ""));
        }

        
        internal static IEnumerable<Platz> ParseRows(IEnumerable<string> platzreihen)
        {
            return platzreihen.SelectMany((reihe, reihennummer) => ParseRow(reihe, reihennummer));
        }


        internal static IEnumerable<Platz> ParseRow(string platzreihe, int reihennummer)
        {
            platzreihe = platzreihe.ToUpper();
            return platzreihe.Select((preiskategorienkürzel, platzindex) => 
                                        new Platz(new Platzposition(BerechneReihenkürzelAusReihennummer(reihennummer),
                                                                    platzindex + 1),
                                                  preiskategorienkürzel));
        }


        internal static char BerechneReihenkürzelAusReihennummer(int reihennummer)
        {
            return Encoding.ASCII.GetChars(new[] {(byte)(Encoding.ASCII.GetBytes(new[]{'A'})[0] + reihennummer)})[0];
        }
    }
}
